#!/usr/bin/env python3

# 收集报表时，原始报表的数据已经有的，需要收集后更新原始报表的内容，就用这个脚本
#

from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import cell
import argparse
import sys


sys.path.append("../lib")
from inner_util import prepare_dir, get_files
from spread_sheet import Spreadsheet  # type: ignore
import datetime


TARGET_DIR = "dist"

FONT_SIZE = 10

DEFAULT_FONT = Font(bold=False, color="000000", size=FONT_SIZE)
RED_FONT = Font(bold=True, color="FF0000", size=FONT_SIZE)


YELLOW_FILL = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
WHITE_FILL = PatternFill(start_color="FFFFff", end_color="FFFFff", fill_type="solid")

NO_WRAP = Alignment(wrap_text=False, vertical="center", horizontal="center")


def get_config(month):
    未开工 = {
        "area": "A8:AN19",
        "target": "附件1：未开工项目清单（玉溪）.xlsx",
    }

    已开工未入库 = {
        "area": "A8:AO35",
        "target": "附件2：已开工未入库清单（玉溪）.xlsx",
    }
    投资完成滞后 = {
        "area": "A8:AP51",
        "target": "附件3：投资完成滞后项目清单（玉溪）.xlsx",
    }

    设备更新 = {
        "area": "A6:R8",
        "target": "设备更新云南省调度表（玉溪）.xlsx",
    }

    能源外工业停建缓建 = {
        "area": "A5:O24",
        "target": "玉溪-附件1：2024年以来能源以外工业停建缓建相关项目清单.xlsx",
    }

    能源工业停建缓建 = {
        "area": "A5:O16",
        "target": "玉溪-附件2：2024年以来能源工业停建缓建相关项目清单.xlsx",
    }

    return {
        "未开工": 未开工,
        "已开工未入库": 已开工未入库,
        "投资完成滞后": 投资完成滞后,
        "设备更新": 设备更新,
        "能源外工业停建缓建": 能源外工业停建缓建,
        "能源工业停建缓建": 能源工业停建缓建,
    }


def get_mod_cells_config(month):
    tmp = {}

    绿色铝 = {
        "A2": f"云南省绿色铝产业建成企业运行情况调度表（2024年{month}月）",
        "J4": f"2024年{month}月产量",
        "L4": f"2024年1-{month}月累计产量",
        "N4": f"2024年{month}月产值",
        "P4": f"2024年1-{month}月累计产值",
        "H20": f"表中数据为上月，请更新为{month}月数据",
    }

    能源外工业5亿元 = {
        "A2": f"云南省各州（市）2024年能源外工业项目投资情况调度表（{month}月）",
        "K3": f"填报日期：2024年{month}月20日",
        "L5": f"2023年1-{month}月完成投资",
        "N5": f"2024年1-{month}月预计完成投资",
    }

    能源外工业预计 = {
        "B2": f"1-{month}月",
        "F2": f"{month}月",
        "P4": f"{month}月预计完成投资（亿元）",
        "Q4": f"1-{month}月预计完成投资（亿元）",
        "R3": f"{month}月通过审核预计新增入库项目（个）",
        "T3": f"{month}月预计完成投资（亿元）",
        "U3": f"1-{month}月预计完成投资（亿元）",
        "H20": f"表中数据为上月，请更新为{month}月数据",
    }

    新能源电池企业 = {
        "I3": f"2024年{month}月产量",
        "K3": f"2024年1-{month}月累计产量",
        "M3": f"2024年{month}月产值",
        "O3": f"2024年1-{month}月累计产值",
    }

    新能源电池项目 = {
        "M4": f"2023年1-{month}月完成投资",
        "N4": f"2023年1-{month+1}月预计完成投资",
        "P4": f"2024年1-{month}月完成投资",
        "Q4": f"2024年{month+1}月预计完成投资",
    }

    新能源电池 = {
        "A1": f"2024年度新能源电池产业企业运行情况预测调度表（{month}月）",
        "G3": f"2024年{month-1}月",
        "H3": f"2024年{month}月",
        "I3": f"2024年1-{month}月",
        "J3": f"2023年1-{month}月",
        "H12": f"表中数据为上月，请更新为{month}月数据",
    }

    工业投资预计 = {"A1": f"工业投资预计（{month}月）"}

    timestamp = datetime.date.today().strftime("%Y-%m-%d")

    未开工 = {"O3": f"表中数据为上周，请更新为{timestamp}数据"}

    已开工未入库 = {
        "O3": f"表中数据为上周，请更新为{timestamp}数据",
    }

    投资完成滞后 = {
        "O3": f"表中数据为上周，请更新为{timestamp}数据",
    }

    设备更新 = {"H4": f"表中数据为上两周，请更新为{timestamp}数据"}

    能源外工业停建缓建 = {
        "F1": f"表中数据为上月，请更新为{month}月数据",
    }

    能源工业停建缓建 = {
        "F1": f"表中数据为上月，请更新为{month}月数据",
    }

    return {
        "tmp": tmp,
        "绿色铝": 绿色铝,
        "能源外工业5亿元": 能源外工业5亿元,
        "能源外工业预计": 能源外工业预计,
        "新能源电池企业": 新能源电池企业,
        "新能源电池项目": 新能源电池项目,
        "工业投资预计": 工业投资预计,
        "新能源电池": 新能源电池,
        "未开工": 未开工,
        "已开工未入库": 已开工未入库,
        "投资完成滞后": 投资完成滞后,
        "设备更新": 设备更新,
        "能源外工业停建缓建": 能源外工业停建缓建,
        "能源工业停建缓建": 能源工业停建缓建,
    }


def parse_args():
    parser = argparse.ArgumentParser(description="汇总表格")
    parser.add_argument("--type", help="报表类型")
    parser.add_argument("--data", help="数据表格路径")
    parser.add_argument("--month", type=int, default=0, help="某月")
    parser.add_argument("template", help="表格模板路径")
    return parser.parse_args()


def build_template(args):
    config = get_config(args.month)[args.type]

    print("Config", config)
    area = config["area"]
    main_file = Spreadsheet(args.template)

    mod_cells = get_mod_cells_config(args.month)[args.type]
    for k, v in mod_cells.items():
        print(f"Mod {k} -> {v}")
        main_file.set_cell_value(k, v)
        main_file.set_cell_style(k, DEFAULT_FONT, WHITE_FILL, alignment=NO_WRAP)

    main_file.set_range_style(area, DEFAULT_FONT, WHITE_FILL)

    main_file.save_as(f"{TARGET_DIR}/{config['target']}")


def recive_data(main_file, args):
    files = get_files(args.data, ".xlsx")
    if len(files) == 0:
        print("No files found")
        return

    config = get_config(args.month)[args.type]

    for f in files:
        print(f"比较 {f} 和原表的差异")
        right_file = Spreadsheet(f)

        mod_cells = main_file.diff(right_file, config["area"])
        row_nums = [cell.coordinate_from_string(x)[1] for x in mod_cells]
        mod_row_index = list(set(row_nums))
        if len(mod_row_index) > 0:
            print(
                "Mod row num",
                mod_row_index,
            )
        for mod_cell in mod_cells:
            main_file.set_cell_style(mod_cell, RED_FONT, YELLOW_FILL)

    timestamp = datetime.date.today().strftime("%Y%m%d")

    main_file.save_as(f"{TARGET_DIR}/{timestamp}-汇总-{config['target']}")


def main():
    prepare_dir(TARGET_DIR, False)

    args = parse_args()

    print("Args", args)

    main_file = Spreadsheet(args.template)

    if args.month != 0:
        build_template(args)

    else:
        recive_data(main_file, args)

    print("Done")
    print("--------------------------------------")


if __name__ == "__main__":
    main()
